<?php

class Application
{
    static protected $params = array();

    /**
     * Путь к корневой директории Фреймворка.
     *
     * @return string
     */
    static function enginePath()
    {
        static $value = null;
        if (is_null($value)) {
            $value = dirname(dirname(__FILE__)) . DIRECTORY_SEPARATOR;
        }
        return $value;
    }

    /**
     * Путь к корневой директории приложения.
     *
     * @return string
     */
    static function rootPath()
    {
        static $value = null;
        if (is_null($value)) {
            $value = Config::get("app_path");
            if (strlen($value)) {
                if ($value[strlen($value) - 1] != self::ds()) {
                    $value .= self::ds();
                }
            }
        }
        return $value;
    }

    /**
     * Возвращает корневой URL приложения.
     *
     * @return string
     */
    static function rootUrl()
    {
        static $value = null;
        if (is_null($value)) {
            $value = self::httpSchema().'://'.self::httpHost().self::rootUrlPath();
        }
        return $value;
    }

    /**
     * Возвращает URL-протокол.
     *
     * @return string
     */
    static function httpSchema()
    {
        return Request::protocol();
    }

    /**
     * Возвращает имя хоста, по которому доступно приложение.
     *
     * @return string
     */
    static function httpHost()
    {
        return Request::host();
    }

    /**
     * Возвращает путь относительно корневого до корневой директории приложения.
     * Для случаев, когда в одном DOCUMENT_ROOT хранится несколько приложений.
     *
     * @return string
     */
    static function rootUrlPath()
    {
        static $value = null;
        if (is_null($value)) {
            $value = strpos(self::rootPath(), self::webRootPath()) === 0
                ? str_replace(DIRECTORY_SEPARATOR, '/', substr(self::rootPath(), strlen(self::webRootPath())))
                : "";
        }
        return $value;
    }

    /**
     * Возвращает разделитель директорий в записи путей файловой системы.
     *
     * @return string
     */
    static function ds()
    {
        return DIRECTORY_SEPARATOR;
    }

    /**
     * Возвращает путь к DOCUMENT_ROOT
     *
     * @return string
     */
    static function webRootPath()
    {
        return Config::get("web_root_path");
    }

    /**
     * Возвращает путь к JavaScript-файлам.
     *
     * @return string
     */
    static function jsPath()
    {
        return self::webRootPath().'js'.self::ds();
    }

    /**
     * Возвращает путь к CSS-стилям.
     *
     * @return string
     */
    static function cssPath()
    {
        return self::webRootPath().'css'.self::ds();
    }

    /**
     * Возвращает путь к картинкам.
     *
     * @return string
     */
    static function imgPath()
    {
        return self::webRootPath().'img'.self::ds();
    }

    static function imgUrlPath()
    {
        return 'img/';
    }

    static function cssUrlPath()
    {
        return 'css/';
    }

    static function jsUrlPath()
    {
        return 'js/';
    }

    static function outputEncodings()
    {
        return encoder::getSupported();
    }

    /**
     * Можно ли использовать сжатие для статических данных (таблицы стилей, JavaScript-файлы).
     *
     * @return bool
     */
    static function useEncodingForStatic()
    {
        return self::allowTextCompress();
    }

    /**
     * Можно ли использовать сжатие при выводе текстовой информации.
     *
     * @return bool
     */
    static function allowTextCompress()
    {
        return Config::get("text_compress");
    }

    /**
     * Возвращает путь к системной директории временных файлов.
     *
     * @return string
     */
    static function systemTempDir()
    {
        static $value;

        if (!isset($value)) {
            if ($tmp_file = tempnam(null, '')) {
                $tmp = dirname($tmp_file);
                if ($tmp == '\\') { // for Windows
                    $value = null;
                } else {
                    $value = $tmp;
                }
            } else {
                $value = null;
            }
            if (file_exists($tmp_file)) {
                unlink($tmp_file);
            }
        }

        return $value;
    }

    /**
     * Возвращает уникальный, на данном компьютере идентификатор приложения.
     *
     * @return string
     */
    static function appId()
    {
        static $value;

        if (!isset($value)) {
            $value = str_replace(self::ds(), '_', str_replace('_', '__', strtr(self::rootPath(), array(':'=>''))));
        }

        return $value;
    }

    /**
     * Возвращает путь к директории для временных файлов.
     *
     * @return string
     */
    static function CachePath()
    {
        $ds = self::ds();

        if (self::systemTempDir()) {
            $path = self::systemTempDir().$ds.self::appId().$ds.'cache';
        } else {
            $path = self::siteRoot().$ds.'tmp'.$ds.'cache';
        }
        if (!file_exists($path)) {
            mkdir($path, 0700, true);
        }

        return $path;
    }

    /**
     * Возвращает путь к директории с кешем CSS-файлов.
     *
     * @return string
     */
    static function CSSCachePath()
    {
        $ds = self::ds();

        $path = self::CachePath().$ds.'css';
        if (!file_exists($path)) {
            mkdir($path, 0700, true);
        }

        return $path;
    }

    /**
     * Возвращает внутренюю кодировку.
     *
     * @return string
     */
    static function encoding()
    {
    	return self::scriptEncoding();
    }

    /**
     * Возвращает кодировку PHP-скриптов.
     *
     * @return string
     */
    static function scriptEncoding()
    {
    	return Config::get("script_encoding");
    }

    /**
     * Возвращает путь к скриптам-шаблонам презентации.
     *
     * @return string
     */
    static function viewPath()
    {
    	return Config::get("views_path");
    }

    /**
     * Возвращает расширение скриптов-шаблонов презентаций.
     *
     * @return string
     */
    static function viewExtenssion()
    {
    	return Config::get("views_ext");
    }

    public static function &o()
    {
        static $instance = null;
        if (is_null($instance)) {
            $instance = new self();
        }
        return $instance;
    }

    private function __construct() {}

    public function __clone()
    {
        throw new ArchException('Clone singleton “'.__CLASS__.'” is not allowed');
    }
}

?>